#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

#include "server.h"

/** HTML source for the start of the page we generate.  */
static char* page_start =
    "<html>\n"
    " <body>\n"
    "  <pre>\n";

/** HTML source for the end of the page we generate.  */
static char* page_end =
    "  </pre>\n"
    " </body>\n"
    "</html>\n";

void module_generate (int fd) {
    pid_t child_pid;
    int rval;

    /** Write the start of the page.  */
    write (fd, page_start, strlen (page_start));
    /** Fork a child process.  */
    child_pid = fork ();
    if (child_pid == 0) {
        /** This is the child process.  */
        /** Set up an argument list for the invocation of df.  */
        char* argv[] = {"/bin/df", "-h", NULL };

        /** Duplicate stdout and stderr to send data to the client socket.  */
        rval = dup2 (fd, STDOUT_FILENO);
        if (rval == -1) 
            system_error ("dup2");
        rval = dup2 (fd, STDERR_FILENO);
        if (rval == -1) 
            system_error ("dup2");
        /** Run df to show the free space on mounted file systems.  */
        execv (argv[0], argv);
        /** A call to execv does not return unless an error occurred.  */
        system_error ("execv");
    } else if (child_pid > 0) {
        /** This is the parent process.  Wait for the child process to 
            finish.  */
        rval = waitpid (child_pid, NULL, 0);
        if (rval == -1) 
            system_error ("waitpid");
    } else {
        /** The call to fork failed.  */
        system_error ("fork");
    }
    /** Write the end of the page.  */
    write (fd, page_end, strlen (page_end));
}


